package _09_Override;
/**
 * 继承之后 子类必须和父类一模一样吗?
 * 不需要
 * 
 * 1.子类有特有的属性,比如 父类只有 m1 ,子类中还有 m2,这个 m2 就是
 * 子类特有的,父类没有
 * 2.子类和父类拥有相同名字的方法,但是功能不一样,叫覆写/复写/覆盖
 * 
 * 覆写特指成员方法,和其他属性无关
 * 
 * 什么时候需要进行覆写?
 * 当父类方法无法满足子类的业务需要时,需要对父类方法进行覆写
 * 
 * 前提条件 :
 * 1.必须有继承关系的体系中
 * 2.不能比原方法有更低的访问权限 >=
 * 3.错误不能越来越多,不能有更宽泛的异常 <=
 * 4.方法名,返回值,参数列表 都必须一致
 * 
 * 方法名不一致,说明是俩方法
 * 参数列表不一致,是方法重载
 * 返回值表示方法的功能,必须一样,不能更改方法的本质
 * 
 * 继承的目的 : 代码重用
 * 
 * 继承最重要的功能 : 方法覆写
 * 
 * 重写的意义 :
 *  功能越来越强
 *  使用范围越来越广
 *  错误越来越少
 *  
 *  Overload 和 Override 的区别?
 *  Overload是重载的意思，表示在同一个类中，允许存在一个以上的同名zhi函数，只要他们的参数
 *  个数或者参数类型不同即可。
 *  Override是覆盖的意思，也就是重写，它与返回值类型无关，只看参数列表。
 *  
 *  两者不同主要体现在:
 *  
 *  1，目的
 *  
 *  overload用于增加程序的可读性(做法不同,但是做的同一事情)。
 *  override用于提供其超级类已经提供的方法的特定实现。
 *  
 *  2，范围
 *  
 *  overload 在相同的类范围内内执行。
 *  override发生在两类具有继承（继承）的关系。
 *  
 *  3， 参数 
 *  
 *  overload参数必须不同。
 *  override参数必须相同。
 *  
 *  4，多态性
 *  
 *  overload 静态多态,调用的函数在编译时被选中。
 *  override 是运行时多态性的。
 *  
 *  5，返回类型
 *  
 *  overload中可以相同或不同。但你必须改变参数。
 *  override必须是相同的或协变的。
 * @author lenovo
 * @Date 2020年7月9日
 * @Time 下午6:47:57
 */
public class Override_01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Cat cat = new Cat();
		cat.move();
		System.out.println(cat.i);

		Animal a = new Animal();
		a.move();

		// 多态
		Animal ac = new Cat();
		ac.move();
		System.out.println(ac.i);

//		猫在走猫步!
//		20
//		动物在移动!
//		猫在走猫步!
//		10

	}

}

class Animal {
	int i = 10;

	public void move() {
		System.out.println("动物在移动!");
	}
}

class Cat extends Animal {
	int i = 20;

	public void move() {
		// super.move();
		System.out.println("猫在走猫步!");
	}
}